# 你想反方向迭代一个序列


a = [1, 2, 3, 4]
for i in reversed(a):
    print(i, end=' ')

print()

# 反向迭代仅仅当对象的大小可预先确定或者对象实现了reversed () 的特殊方法时才能生效。
# 如果两者都不符合，那你必须先将对象转换为一个列表才行，比如：
#    f = open('somefile')
#    for line in reversed(list(f)):
#        print(line, end=' ')


# 可以通过在自定义类上实现reversed () 方法来实现反向迭代
# 定义一个反向迭代器可以使得代码非常的高效，因为它不再需要将数据填充到一个列表中然后再去反向迭代这个列表。


class Countdown:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        n = self.start
        while n > 0:
            yield n
            n -= 1

    def __reversed__(self):
        n = 1
        while n <= self.start:
            yield n
            n += 1

for i in reversed(Countdown(30)):
    print(i, end=" ")

print()

for i in Countdown(30):
    print(i, end=" ")

